package encoder;

import util.Common;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;

public class RtmpVideoEncoder {

    /**
     * 编码关键帧视频
     * @param sps
     * @param pps
     * @return
     */
    public static byte[] encoderSPSPPS(byte[] sps, byte[] pps){
        ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(1024);
        byte[] head = new byte[]{
                0x17, //这里0x17 表示I帧 AVC
                0x00, //AVC packet type ： 1字节
                      //    0x00： AVC Sequence Header 0x01： AVC NALU
                0x00, 0x00, 0x00, //    composition time ： 3字节， AVC时无意义，全为0
                //下面 是AVCDecoderConfigurationRecord 内容
                0x01, //版本 configurationVersion
                (byte) sps[1], // AVCProfileIndication
                (byte) sps[2], //profile_compatibility
                (byte) sps[3], //AVCLevelIndication
                (byte) 0xFF, //FLV中NALU包长数据所使用的字节数，包长= （lengthSizeMinusOne & 3） + 1
                (byte) 0xE1 //SPS个数，通常为0xe1 个数= numOfSequenceParameterSets & 01F
        };
        byteBuf.writeBytes(head);
        byteBuf.writeBytes(Common.int2Bytes16(sps.length)); //sps 长度
        byteBuf.writeBytes(sps); // sps 内容
        byteBuf.writeBytes(new byte[]{0x01});//sps 个数
        byteBuf.writeBytes(Common.int2Bytes16(pps.length)); // pps 长度
        byteBuf.writeBytes(pps); // pps内容
        int len = byteBuf.readableBytes();
        byte[] encoderData = new byte[len];
        byteBuf.readBytes(encoderData);
        byteBuf.release();
        return encoderData;
    }

    public static byte[] encoderBody(byte[] data, int flag){
        ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(1024);
        if (flag == 1) {
            byteBuf.writeByte(0x17);
        } else {
            byteBuf.writeByte(0x27);
        }
        byteBuf.writeBytes(new byte[]{0x01, 0x00, 0x00, 0x00});
        byteBuf.writeBytes(data);
        int len = byteBuf.readableBytes();
        byte[] encoderData = new byte[len];
        byteBuf.readBytes(encoderData);
        byteBuf.release();
        return encoderData;
    }
}
